package ar.edu.unsam.algo2.tp2.partido

import ar.edu.unsam.algo2.tp2.partido.observers.AvisarPartidoConfirmado
import ar.edu.unsam.algo2.tp2.partido.observers.AvisoInscripcion
import ar.edu.unsam.algo2.tp2.partido.observers.InfraccionPorBaja
import junit.framework.Assert
import org.junit.Test

import static org.mockito.Matchers.*
import static org.mockito.Mockito.*

class TestObservers extends TestInicializar {

	@Test
	def void testNotificarInscripcionALosAmigos() {
		var StubDespachadorMails despachador = mock(typeof(StubDespachadorMails))
		partido.observers.add(new AvisoInscripcion(despachador))
		partido.agregarJugador(nicolas)
		verify(despachador, times(9)).enviar(any(typeof(Mail)))
	}

	@Test
	def void testNotificarPartidoConfirmado() {
		var StubDespachadorMails despachador = new StubDespachadorMails
		partido.observers.add(new AvisarPartidoConfirmado(despachador))

		Assert::assertEquals(0, despachador.mailsPara("administrador@partido.com.ar").size)
		partido.agregarJugador(nicolas)
		Assert::assertEquals(1, despachador.mailsPara("administrador@partido.com.ar").size)
	}

	@Test
	def void testInfraccionPorBaja() {
		partido.observers.add(new InfraccionPorBaja)
		Assert::assertEquals(0, pepe.infracciones.size)
		partido.quitarJugador(pepe)
		Assert::assertEquals(1, pepe.infracciones.size)
	}

	@Test
	def void testQuitarJugadorConRemplazante() {
		Assert::assertEquals(0, pepe.infracciones.size)
		partido.observers.add(new InfraccionPorBaja)
		partido.quitarJugador(pepe, federico)
		Assert::assertEquals(0, pepe.infracciones.size)
	}

	@Test
	def void testTodosLosObservers() {
		var StubDespachadorMails despachador = mock(typeof(StubDespachadorMails))
		partido.observers.add(new AvisoInscripcion(despachador))
		partido.observers.add(new AvisarPartidoConfirmado(despachador))
		partido.observers.add(new InfraccionPorBaja)
		partido.agregarJugador(nicolas)
		verify(despachador, times(10)).enviar(any(typeof(Mail)))
	}
}
